BlitTexturePass.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. #if !UNITY_2022_3_OR_NEWER
  2. using UnityEngine;
  3. using UnityEngine.Rendering;
  4. using UnityEngine.Rendering.Universal;
  5. namespace FlatKit {
  6. internal class BlitTexturePass : ScriptableRenderPass {
  7. public static readonly string CopyEffectShaderName = "Hidden/FlatKit/CopyTexture";
  8. private readonly ProfilingSampler _profilingSampler;
  9. private readonly Material _effectMaterial;
  10. private readonly ScriptableRenderPassInput _passInput;
  11. private readonly Material _copyMaterial;
  12. #if UNITY_2022_1_OR_NEWER
  13. private RTHandle _temporaryColorTexture;
  14. #else
  15. private RenderTargetHandle _temporaryColorTexture;
  16. #endif
  17. public BlitTexturePass(Material effectMaterial, bool useDepth, bool useNormals, bool useColor) {
  18. _effectMaterial = effectMaterial;
  19. var name = effectMaterial.name.Substring(effectMaterial.name.LastIndexOf('/') + 1);
  20. _profilingSampler = new ProfilingSampler($"Blit {name}");
  21. _passInput = (useColor ? ScriptableRenderPassInput.Color : ScriptableRenderPassInput.None) |
  22. (useDepth ? ScriptableRenderPassInput.Depth : ScriptableRenderPassInput.None) |
  23. (useNormals ? ScriptableRenderPassInput.Normal : ScriptableRenderPassInput.None);
  24. #if !UNITY_2022_1_OR_NEWER
  25. _copyMaterial = CoreUtils.CreateEngineMaterial(CopyEffectShaderName);
  26. #endif
  27. }
  28. public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) {
  29. ConfigureInput(_passInput);
  30. base.Configure(cmd, cameraTextureDescriptor);
  31. }
  32. public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) {
  33. #if !UNITY_2022_1_OR_NEWER
  34. ConfigureTarget(new RenderTargetIdentifier(renderingData.cameraData.renderer.cameraColorTarget, 0,
  35. CubemapFace.Unknown, -1));
  36. _temporaryColorTexture.Init("_EffectTexture");
  37. #endif
  38. }
  39. public void Setup(RenderingData renderingData) {
  40. #if UNITY_2022_1_OR_NEWER
  41. var descriptor = renderingData.cameraData.cameraTargetDescriptor;
  42. descriptor.depthBufferBits = 0;
  43. RenderingUtils.ReAllocateIfNeeded(ref _temporaryColorTexture, descriptor, wrapMode: TextureWrapMode.Clamp,
  44. name: "_EffectTexture");
  45. #endif
  46. }
  47. public void Dispose() {
  48. #if UNITY_2022_1_OR_NEWER
  49. _temporaryColorTexture?.Release();
  50. #endif
  51. }
  52. public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) {
  53. if (_effectMaterial == null) return;
  54. CommandBuffer cmd = CommandBufferPool.Get();
  55. using (new ProfilingScope(cmd, _profilingSampler)) {
  56. var descriptor = renderingData.cameraData.cameraTargetDescriptor;
  57. descriptor.depthBufferBits = 0;
  58. SetSourceSize(cmd, descriptor);
  59. #if UNITY_2022_1_OR_NEWER
  60. var cameraTargetHandle = renderingData.cameraData.renderer.cameraColorTargetHandle;
  61. // cmd.GetTemporaryRT(Shader.PropertyToID(_temporaryColorTexture.name), descriptor);
  62. #else
  63. var cameraTargetHandle = renderingData.cameraData.renderer.cameraColorTarget;
  64. cmd.GetTemporaryRT(_temporaryColorTexture.id, descriptor);
  65. #endif
  66. // Also seen as `renderingData.cameraData.xr.enabled` and `#if ENABLE_VR && ENABLE_XR_MODULE`.
  67. if (renderingData.cameraData.xrRendering) {
  68. _effectMaterial.EnableKeyword("_USE_DRAW_PROCEDURAL"); // `UniversalRenderPipelineCore.cs`.
  69. #if UNITY_2022_1_OR_NEWER
  70. #pragma warning disable CS0618
  71. cmd.SetRenderTarget(_temporaryColorTexture);
  72. cmd.DrawMesh(RenderingUtils.fullscreenMesh, Matrix4x4.identity, _effectMaterial, 0, 0);
  73. cmd.SetGlobalTexture("_EffectTexture", _temporaryColorTexture);
  74. cmd.SetRenderTarget(new RenderTargetIdentifier(cameraTargetHandle, 0, CubemapFace.Unknown, -1));
  75. cmd.DrawMesh(RenderingUtils.fullscreenMesh, Matrix4x4.identity, _copyMaterial, 0, 0);
  76. #else
  77. cmd.SetRenderTarget(_temporaryColorTexture.Identifier());
  78. cmd.DrawMesh(RenderingUtils.fullscreenMesh, Matrix4x4.identity, _effectMaterial, 0, 0);
  79. cmd.SetGlobalTexture("_EffectTexture", _temporaryColorTexture.Identifier());
  80. cmd.SetRenderTarget(new RenderTargetIdentifier(cameraTargetHandle, 0, CubemapFace.Unknown, -1));
  81. cmd.DrawMesh(RenderingUtils.fullscreenMesh, Matrix4x4.identity, _copyMaterial, 0, 0);
  82. #endif
  83. } else {
  84. _effectMaterial.DisableKeyword("_USE_DRAW_PROCEDURAL");
  85. // Note: `FinalBlitPass` has `cmd.SetRenderTarget` at this point, but it's unclear what that does.
  86. #if UNITY_2022_1_OR_NEWER
  87. cmd.Blit(cameraTargetHandle, _temporaryColorTexture, _effectMaterial, 0);
  88. cmd.Blit(_temporaryColorTexture, cameraTargetHandle);
  89. #else
  90. cmd.Blit(cameraTargetHandle, _temporaryColorTexture.Identifier(), _effectMaterial, 0);
  91. cmd.Blit(_temporaryColorTexture.Identifier(), cameraTargetHandle);
  92. #endif
  93. }
  94. }
  95. context.ExecuteCommandBuffer(cmd);
  96. cmd.Clear();
  97. CommandBufferPool.Release(cmd);
  98. }
  99. // Copied from `PostProcessUtils.cs`.
  100. private static void SetSourceSize(CommandBuffer cmd, RenderTextureDescriptor desc) {
  101. float width = desc.width;
  102. float height = desc.height;
  103. if (desc.useDynamicScale) {
  104. width *= ScalableBufferManager.widthScaleFactor;
  105. height *= ScalableBufferManager.heightScaleFactor;
  106. }
  107. cmd.SetGlobalVector("_SourceSize", new Vector4(width, height, 1.0f / width, 1.0f / height));
  108. }
  109. }
  110. }
  111. #endif